'use strict';
const pump = require('mz-modules/pump');
const fs = require('fs');
const path = require('path');
const { registerUserNameNotExistInfo, registerFailInfo, changeInfoFailInfo, changePasswordFailInfo } = require('../utils/ErrorModel');
const { SuccessModel, ErrorModel } = require('../utils/resultModel');

const Controller = require('egg').Controller;

class UserController extends Controller {
  // 获取登录信息
  getUserInfo() {
    let data = {
      isLogin: false, // 初始默认是未登录状态
    };
    // 如果用户已经登录
    const userInfo = this.ctx.session.userInfo;
    if (userInfo) {
      data = {
        isLogin: true,
        userName: userInfo.userName,
      };
    }
    return data;
  }

  // 登录页面
  async loginPage() {
    await this.ctx.render('login.html', this.getUserInfo());
  }

  // 注册页面
  async registerPage() {
    await this.ctx.render('register.html', this.getUserInfo());
  }

  // 个人设置页面
  async settingPage() {
    // 获取用户信息
    const userInfo = this.ctx.session.userInfo;
    await this.ctx.render('setting.html', {
      isNav: true,
      userInfo,
    });
  }
  // 注册
  async register() {
    // 或取到数据，用户名，密码，性别
    const { userName, password, gender } = this.ctx.request.body;

    // 在service中做业务处理
    // try ...catch 当语法错误时，会抛出异常（catch），而不是中止服务
    try {
      const result = await this.service.user.createUser({
        userName,
        password,
        gender,
      });

      // 注册成功，自己关注自己，方便首页获取关注人的博客列表
      await this.service.userRelation.addFollower(
        result.id,
        result.id
      );

      // 当注册成功时，可以什么都不返回，
      this.ctx.body = new SuccessModel();
    } catch (err) {
      // 打印错误信息，错误栈 ，以后讲日志时再说
      console.log(err.message, err.stack);
      return new ErrorModel(registerFailInfo);
    }
  }

  // 用户名是否存在
  async isExist() {
    // const { ctx } = this;
    const { userName } = this.ctx.request.body;
    // service
    const getUserInfo = await this.service.user.getUserInfo(userName);

    console.log(getUserInfo);

    if (getUserInfo) {
      // 成功时直接返回，不需要传递数据  {errno:0,data:{}}
      this.ctx.body = new SuccessModel();
    } else {
      // 失败返回错误信息
      this.ctx.body = new ErrorModel(registerUserNameNotExistInfo);
    }
  }

  // 登录
  async login() {
    // 获取前端请求的用户名和密码
    const { userName, password } = this.ctx.request.body;
    const userInfo = await this.service.user.doLogin({ userName, password });

    this.ctx.body = userInfo;
  }

  // 删除当前用户
  async deleteCurrentUser() {
    // 单元测试的情况下执行删除
    if (this.app.config.env === 'unittest') {
      // 在session中获取用户信息
      console.log(this.ctx.session.userInfo);
      const { userName } = this.ctx.session.userInfo;
      // 在service中删除用户信息
      const result = await this.service.user.deleteCurrentUser(userName);
      this.ctx.body = result;
    }
  }

  // 更改用户基本信息
  async changeUserInfo() {
    // 获取数据，昵称，城市，图片地址
    const { nickName, city } = this.ctx.request.body;

    // 图片上传并保存
    const file = this.ctx.request.files[0];
    let url = '/images/avatar.jpg';
    if (file) {
      const filename = '' + Date.now() + Math.ceil((Math.random() * 10000)) + file.filename.toLowerCase();
      try {
        const targetPath = path.join(this.config.baseDir, 'app/public/uploads/images', filename);
        const source = fs.createReadStream(file.filepath);
        const target = fs.createWriteStream(targetPath); // 不会自动创建文件夹
        const result = await pump(source, target);
        console.log(result);
        this.ctx.logger.warn('save %s to %s', file.filepath, targetPath);
      } finally {
        await this.ctx.cleanupRequestFiles();
      }
      url = '/uploads/images/' + filename;
    }


    // 获取用户名， 被更改人
    const { userName } = this.ctx.session.userInfo;
    // 调用service中的 updateUser(更新后的值，查询条件) 方法
    const result = await this.service.user.updateUser({
      newNickName: nickName,
      newCity: city,
      newAvatar: url,
    }, { userName });

    if (result) {
      Object.assign(this.ctx.session.userInfo, {
        nickName,
        city,
        avatar: url,
      });
      this.ctx.body = new SuccessModel();
    } else {
      this.ctx.body = new ErrorModel(changeInfoFailInfo);
    }
  }

  // 更改密码
  async changePassword() {
    // 获取密码，用户名
    const { userName } = this.ctx.session.userInfo;
    const { newPassword, oldPassword } = this.ctx.request.body;

    // 将数据交给service处理
    const result = await this.service.user.updateUser({ newPassword }, { userName, password: oldPassword });

    // this.ctx.body = result;
    if (result) {
      this.ctx.body = new SuccessModel();
    } else {
      this.ctx.body = new ErrorModel(changePasswordFailInfo);
    }
  }

  async logout() {
    // 在session中删除用户信息
    delete this.ctx.session.userInfo;
    this.ctx.body = new SuccessModel();
  }

  // 获取 at 列表
  async getAtList() {
    const { id } = this.ctx.session.userInfo;

    // 获取关注人列表
    const result = await this.service.userRelation.getFollower(id);
    // result={count,userList}
    // ['张三 - zhangsan',...'nickName - userName']
    const atList = result.userList.map(user => {
      // '张三 - zhangsan'
      return `${user.nickName} - ${user.userName}`;
    });
    this.ctx.body = atList;
  }
}

module.exports = UserController;
